package com.shujia.sql

import org.apache.spark.SparkContext
import org.apache.spark.sql.{DataFrame, SparkSession}

/**
 *  Spark SQL 使用DSL语法编写sql分析
 */
object DSLApiDemo {
  def main(args: Array[String]): Unit = {
    val ss: SparkSession = SparkSession.builder()
      .master("local")
      .appName("DSL语法学习")
      .getOrCreate()

    val sc: SparkContext = ss.sparkContext

    //---------------------DSL实现单词统计----------------------------
    val df1: DataFrame = ss.read
      .format("csv")
      .option("seq", "\n")
      .schema("line STRING")
      .load("spark/data/words.txt")

    /**
     *  如果想要使用DSL语法编写sparksql的话，需要导入一个隐式转换
     */
    import org.apache.spark.sql.functions._  // 可以在DSL语法中使用hive中的一些函数
    import ss.implicits._  // 可以将一个普通的列名变成一个对象

    //老版本分组后直接跟一个聚合函数，然后再跟一个select起别名
//    val resRDD: DataFrame = df1.select(explode(split($"line", " ")) as "word")
//      .groupBy($"word") //group by之后的结果不是DataFrame类型，不能直接show，需要紧跟着一个聚合操作
//      .count()
//      .select($"word" as "new_word", $"count" as "w_counts")

    //新版本分组后跟一个agg函数，进行聚合的同时起别名
//    df1.select(explode(split($"line", " ")) as "word")
//      .groupBy($"word") //group by之后的结果不是DataFrame类型，不能直接show，需要紧跟着一个聚合操作
//      .agg(count(lit(1)) as "new_counts").show()






  }
}
